package com.jar.exercise.jvm操作;

/**
 * <div  style="border:2px solid none;margin:20px;padding:15px;font-size:24px;text-align:center;color:aqua;">
 *
 *
 *
 *  </div>
 *
 * @author zhangshun
 * @date 2021/5/18 17:04
 */
public class VolatileTest {

    public static void main(String[] args) {
        new Flag().t1();
    }


}

/**
 *  此例可以看出，线程中的工作空间之间是不可见的。
 */
class Flag{

    /**
     *   volatile MESI 缓存一致性协议。
     *
     *   MESI 为我们去嗅探 标识的属性将 1. 重排序 2. 强制写入主内存 3. 如果是写操作，会导致其他的cpu对应的缓存失效。
     *
     */
    private volatile boolean flag = false;

    public void t1(){
        Flag flags = new Flag();

        Thread thread1 = new Thread(() -> {
            while (!flags.flag) {// 使用了  read -> load -> use
            }
            System.out.println("循环结束");
        });

        Thread thread2 = new Thread(() -> {
            // assign 改变线程栈 的副本
            // store 同步到 主存中
            // write 写入到主存中
            flags.flag = true; // 使用了 flag   read -> load -> use -> assign -> store -> write
        });

        thread1.start();
        thread2.start();

    }

    public int test1(int n) {
        int t;
        if (n == 1) {
            t = 1;
        } else {
            t = 2;
        }

        return t;
    }

    public int test2(int n) {
        if (n == 1) {
            return 1;
        }
        return 2;

    }


}